home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Mac / Modules / waste / wastesupport.py < prev    next >
Text File  |  1996-05-19  |  12KB  |  403 lines

  1. # This script generates a Python interface for an Apple Macintosh Manager.
  2. # It uses the "bgen" package to generate C code.
  3. # The function specifications are generated by scanning the mamager's header file,
  4. # using the "scantools" package (customized for this particular manager).
  5.  
  6. import string
  7.  
  8. # Declarations that change for each manager
  9. MACHEADERFILE = 'WASTE.h'        # The Apple header file
  10. MODNAME = 'waste'                # The name of the module
  11. OBJECTNAME = 'waste'            # The basic name of the objects used here
  12. KIND = 'Ptr'                # Usually 'Ptr' or 'Handle'
  13.  
  14. # The following is *usually* unchanged but may still require tuning
  15. MODPREFIX = MODNAME            # The prefix for module-wide routines
  16. OBJECTTYPE = "WEReference"        # The C type used to represent them
  17. OBJECTPREFIX = MODPREFIX + 'Obj'    # The prefix for object methods
  18. INPUTFILE = 'wastegen.py' # The file generated by the scanner
  19. TYPETESTFILE = 'wastetypetest.py'    # Another file generated by the scanner
  20. OUTPUTFILE = "wastemodule.c"    # The file generated by this program
  21.  
  22. from macsupport import *
  23.  
  24. # Create the type objects
  25. WEReference = OpaqueByValueType("WEReference", "wasteObj")
  26. ExistingWEReference = OpaqueByValueType("WEReference", "ExistingwasteObj")
  27. WEObjectReference = OpaqueByValueType("WEObjectReference", "WEOObj")
  28. StScrpHandle = OpaqueByValueType("StScrpHandle", "ResObj")
  29. RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
  30. EventModifiers = Type("EventModifiers", "h")
  31. FlavorType = OSTypeType("FlavorType")
  32. WESelector = OSTypeType("WESelector")
  33.  
  34. OptHandle = OpaqueByValueType("Handle", "OptResObj")
  35. OptSoupHandle = OpaqueByValueType("WESoupHandle", "OptResObj")
  36. OptStScrpHandle = OpaqueByValueType("StScrpHandle", "OptResObj")
  37.  
  38. WEStyleMode = Type("WEStyleMode", "h")
  39. WEActionKind = Type("WEActionKind", "h")
  40. WEAlignment = Type("WEAlignment", "b")
  41. WESoupHandle = OpaqueByValueType("WESoupHandle", "ResObj")
  42. WERunInfo = OpaqueType("WERunInfo", "RunInfo")
  43.  
  44. TextStyle = OpaqueType("TextStyle", "TextStyle")
  45. TextStyle_ptr = TextStyle
  46. LongPt = OpaqueType("LongPt", "LongPt")
  47. LongPt_ptr = LongPt
  48. LongRect = OpaqueType("LongRect", "LongRect")
  49. LongRect_ptr = LongRect
  50.  
  51. includestuff = includestuff + """
  52. #include <%s>""" % MACHEADERFILE + """
  53. #include <WEObjectHandlers.h>
  54.  
  55. /* Exported by Qdmodule.c: */
  56. extern PyObject *QdRGB_New(RGBColor *);
  57. extern int QdRGB_Convert(PyObject *, RGBColor *);
  58.  
  59. /* Forward declaration */
  60. staticforward PyObject *WEOObj_New(WEObjectReference);
  61. staticforward PyObject *ExistingwasteObj_New(WEReference);
  62.  
  63. /*
  64. ** Parse/generate TextStyle records
  65. */
  66. static
  67. PyObject *TextStyle_New(itself)
  68.     TextStylePtr itself;
  69. {
  70.  
  71.     return Py_BuildValue("lllO&", (long)itself->tsFont, (long)itself->tsFace, (long)itself->tsSize, QdRGB_New,
  72.                 &itself->tsColor);
  73. }
  74.  
  75. static
  76. TextStyle_Convert(v, p_itself)
  77.     PyObject *v;
  78.     TextStylePtr p_itself;
  79. {
  80.     long font, face, size;
  81.     
  82.     if( !PyArg_ParseTuple(v, "lllO&", &font, &face, &size, QdRGB_Convert, &p_itself->tsColor) )
  83.         return 0;
  84.     p_itself->tsFont = (short)font;
  85.     p_itself->tsFace = (Style)face;
  86.     p_itself->tsSize = (short)size;
  87.     return 1;
  88. }
  89.  
  90. /*
  91. ** Parse/generate RunInfo records
  92. */
  93. static
  94. PyObject *RunInfo_New(itself)
  95.     WERunInfo *itself;
  96. {
  97.  
  98.     return Py_BuildValue("llhhO&O&", itself->runStart, itself->runEnd, itself->runHeight,
  99.         itself->runAscent, TextStyle_New, &itself->runStyle, WEOObj_New, itself->runObject);
  100. }
  101.  
  102. /* Conversion of long points and rects */
  103. int
  104. LongRect_Convert(PyObject *v, LongRect *r)
  105. {
  106.     return PyArg_Parse(v, "(llll)", &r->left, &r->top, &r->right, &r->bottom);
  107. }
  108.  
  109. PyObject *
  110. LongRect_New(LongRect *r)
  111. {
  112.     return Py_BuildValue("(llll)", r->left, r->top, r->right, r->bottom);
  113. }
  114.  
  115.  
  116. LongPt_Convert(PyObject *v, LongPt *p)
  117. {
  118.     return PyArg_Parse(v, "(ll)", &p->h, &p->v);
  119. }
  120.  
  121. PyObject *
  122. LongPt_New(LongPt *p)
  123. {
  124.     return Py_BuildValue("(ll)", p->h, p->v);
  125. }
  126.  
  127. /* Stuff for the callbacks: */
  128. static PyObject *callbackdict;
  129. WENewObjectUPP upp_new_handler;
  130. WEDisposeObjectUPP upp_dispose_handler;
  131. WEDrawObjectUPP upp_draw_handler;
  132. WEClickObjectUPP upp_click_handler;
  133.  
  134. static OSErr
  135. any_handler(WESelector what, WEObjectReference who, PyObject *args, PyObject **rv)
  136. {
  137.     FlavorType tp;
  138.     PyObject *key, *func;
  139.     
  140.     if ( args == NULL ) return errAECorruptData;
  141.     
  142.     tp = WEGetObjectType(who);
  143.     
  144.     if( (key=Py_BuildValue("O&O&", PyMac_BuildOSType, tp, PyMac_BuildOSType, what)) == NULL)
  145.         return errAECorruptData;
  146.     if( (func = PyDict_GetItem(callbackdict, key)) == NULL ) {
  147.         Py_DECREF(key);
  148.         return errAEHandlerNotFound;
  149.     }
  150.     Py_INCREF(func);
  151.     *rv = PyEval_CallObject(func, args);
  152.     Py_DECREF(func);
  153.     Py_DECREF(key);
  154.     if ( *rv == NULL ) {
  155.         fprintf(stderr, "--Exception in callback: ");
  156.         PyErr_Print();
  157.         return errAEReplyNotArrived;
  158.     }
  159.     return 0;
  160. }
  161.  
  162. static pascal OSErr
  163. my_new_handler(Point *objectSize, WEObjectReference objref)
  164. {
  165.     PyObject *args=NULL, *rv=NULL;
  166.     OSErr err;
  167.     
  168.     args=Py_BuildValue("(O&)", WEOObj_New, objref);
  169.     err = any_handler(weNewHandler, objref, args, &rv);
  170.     if (!err) {
  171.         if (!PyMac_GetPoint(rv, objectSize) )
  172.             err = errAECoercionFail;
  173.     }
  174.     if ( args ) Py_DECREF(args);
  175.     if ( rv ) Py_DECREF(rv);
  176.     return err;
  177. }
  178.  
  179. static pascal OSErr
  180. my_dispose_handler(WEObjectReference objref)
  181. {
  182.     PyObject *args=NULL, *rv=NULL;
  183.     OSErr err;
  184.     
  185.     args=Py_BuildValue("(O&)", WEOObj_New, objref);
  186.     err = any_handler(weDisposeHandler, objref, args, &rv);
  187.     if ( args ) Py_DECREF(args);
  188.     if ( rv ) Py_DECREF(rv);
  189.     return err;
  190. }
  191.  
  192. static pascal OSErr
  193. my_draw_handler(Rect *destRect, WEObjectReference objref)
  194. {
  195.     PyObject *args=NULL, *rv=NULL;
  196.     OSErr err;
  197.     
  198.     args=Py_BuildValue("O&O&", PyMac_BuildRect, destRect, WEOObj_New, objref);
  199.     err = any_handler(weDrawHandler, objref, args, &rv);
  200.     if ( args ) Py_DECREF(args);
  201.     if ( rv ) Py_DECREF(rv);
  202.     return err;
  203. }
  204.  
  205. static pascal Boolean
  206. my_click_handler(Point hitPt, EventModifiers modifiers,
  207.         unsigned long clickTime, WEObjectReference objref)
  208. {
  209.     PyObject *args=NULL, *rv=NULL;
  210.     int retvalue;
  211.     OSErr err;
  212.     
  213.     args=Py_BuildValue("O&llO&", PyMac_BuildPoint, hitPt,
  214.             (long)modifiers, (long)clickTime, WEOObj_New, objref);
  215.     err = any_handler(weClickHandler, objref, args, &rv);
  216.     if (!err)
  217.         retvalue = PyInt_AsLong(rv);
  218.     else
  219.         retvalue = 0;
  220.     if ( args ) Py_DECREF(args);
  221.     if ( rv ) Py_DECREF(rv);
  222.     return retvalue;
  223. }
  224.         
  225.  
  226. """
  227. finalstuff = finalstuff + """
  228. /* Return the object corresponding to the window, or NULL */
  229.  
  230. PyObject *
  231. ExistingwasteObj_New(w)
  232.     WEReference w;
  233. {
  234.     PyObject *it = NULL;
  235.     
  236.     if (w == NULL)
  237.         it = NULL;
  238.     else
  239.         WEGetInfo(weRefCon, (void *)&it, w);
  240.     if (it == NULL || ((wasteObject *)it)->ob_itself != w)
  241.         it = Py_None;
  242.     Py_INCREF(it);
  243.     return it;
  244. }
  245. """
  246.  
  247. class WEMethodGenerator(OSErrMethodGenerator):
  248.     """Similar to MethodGenerator, but has self as last argument"""
  249.  
  250.     def parseArgumentList(self, args):
  251.         args, a0 = args[:-1], args[-1]
  252.         t0, n0, m0 = a0
  253.         if m0 != InMode:
  254.             raise ValueError, "method's 'self' must be 'InMode'"
  255.         self.itself = Variable(t0, "_self->ob_itself", SelfMode)
  256.         FunctionGenerator.parseArgumentList(self, args)
  257.         self.argumentList.append(self.itself)
  258.  
  259.  
  260.  
  261. class WEObjectDefinition(GlobalObjectDefinition):
  262.     def outputCheckNewArg(self):
  263.         Output("""if (itself == NULL) {
  264.                     PyErr_SetString(waste_Error,"Cannot create null WE");
  265.                     return NULL;
  266.                 }""")
  267.     def outputInitStructMembers(self):
  268.         GlobalObjectDefinition.outputInitStructMembers(self)
  269.         Output("WESetInfo(weRefCon, (void *)&it, itself);")
  270.     def outputFreeIt(self, itselfname):
  271.         Output("WEDispose(%s);", itselfname)
  272.         
  273. class WEOObjectDefinition(GlobalObjectDefinition):
  274.     def outputCheckNewArg(self):
  275.         Output("""if (itself == NULL) {
  276.                     Py_INCREF(Py_None);
  277.                     return Py_None;
  278.                 }""")
  279.                 
  280. variablestuff = """
  281.     callbackdict = PyDict_New();
  282.     if (callbackdict == NULL || PyDict_SetItemString(d, "callbacks", callbackdict) != 0)
  283.         Py_FatalError("can't initialize Waste.callbackdict");
  284.     upp_new_handler = NewWENewObjectProc(my_new_handler);
  285.     upp_dispose_handler = NewWEDisposeObjectProc(my_dispose_handler);
  286.     upp_draw_handler = NewWEDrawObjectProc(my_draw_handler);
  287.     upp_click_handler = NewWEClickObjectProc(my_click_handler);
  288. """
  289.  
  290.  
  291. # From here on it's basically all boiler plate...
  292.  
  293. # Test types used for existence
  294. ## execfile(TYPETESTFILE)
  295.  
  296. # Create the generator groups and link them
  297. module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
  298. object = WEObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
  299. object2 = WEOObjectDefinition("WEO", "WEOObj", "WEObjectReference")
  300. module.addobject(object2)
  301. module.addobject(object)
  302.  
  303. # Create the generator classes used to populate the lists
  304. Function = OSErrFunctionGenerator
  305. Method = WEMethodGenerator
  306. Method2 = OSErrMethodGenerator
  307.  
  308. # Create and populate the lists
  309. functions = []
  310. methods = []
  311. methods2 = []
  312. execfile(INPUTFILE)
  313.  
  314. # A function written by hand:
  315. stdhandlers_body = """
  316.     OSErr err;
  317.     // install the sample object handlers for pictures and sounds
  318. #define    kTypePicture            'PICT'
  319. #define    kTypeSound                'snd '
  320.     
  321.     if ( !PyArg_ParseTuple(_args, "") ) return NULL;
  322.     
  323.     if ((err = WEInstallObjectHandler(kTypePicture, weNewHandler,
  324.                 (UniversalProcPtr) NewWENewObjectProc(HandleNewPicture), NULL)) != noErr)
  325.         goto cleanup;
  326.     
  327.     if ((err = WEInstallObjectHandler(kTypePicture, weDisposeHandler,
  328.                 (UniversalProcPtr) NewWEDisposeObjectProc(HandleDisposePicture), NULL)) != noErr)
  329.         goto cleanup;
  330.     
  331.     if ((err = WEInstallObjectHandler(kTypePicture, weDrawHandler,
  332.                 (UniversalProcPtr) NewWEDrawObjectProc(HandleDrawPicture), NULL)) != noErr)
  333.         goto cleanup;
  334.     
  335.     if ((err = WEInstallObjectHandler(kTypeSound, weNewHandler,
  336.                 (UniversalProcPtr) NewWENewObjectProc(HandleNewSound), NULL)) != noErr)
  337.         goto cleanup;
  338.     
  339.     if ((err = WEInstallObjectHandler(kTypeSound, weDrawHandler,
  340.                 (UniversalProcPtr) NewWEDrawObjectProc(HandleDrawSound), NULL)) != noErr)
  341.         goto cleanup;
  342.     
  343.     if ((err = WEInstallObjectHandler(kTypeSound, weClickHandler,
  344.                 (UniversalProcPtr) NewWEClickObjectProc(HandleClickSound), NULL)) != noErr)
  345.         goto cleanup;
  346.     Py_INCREF(Py_None);
  347.     return Py_None;
  348.     
  349. cleanup:
  350.     return PyMac_Error(err);
  351. """
  352.  
  353. inshandler_body = """
  354.     OSErr err;
  355.     FlavorType objectType;
  356.     WESelector selector;
  357.     PyObject *py_handler;
  358.     UniversalProcPtr handler;
  359.     WEReference we = NULL;
  360.     PyObject *key;
  361.     
  362.     
  363.     if ( !PyArg_ParseTuple(_args, "O&O&O|O&",
  364.             PyMac_GetOSType, &objectType,
  365.             PyMac_GetOSType, &selector,
  366.             &py_handler,
  367.             ExistingwasteObj_New, &we) ) return NULL;
  368.             
  369.     if ( selector == weNewHandler ) handler = (UniversalProcPtr)upp_new_handler;
  370.     else if ( selector == weDisposeHandler ) handler = (UniversalProcPtr)upp_dispose_handler;
  371.     else if ( selector == weDrawHandler ) handler = (UniversalProcPtr)upp_draw_handler;
  372.     else if ( selector == weClickHandler ) handler = (UniversalProcPtr)upp_click_handler;
  373.     else return PyMac_Error(weUndefinedSelectorErr);
  374.             
  375.     if ((key = Py_BuildValue("O&O&", 
  376.             PyMac_BuildOSType, objectType, 
  377.             PyMac_BuildOSType, selector)) == NULL )
  378.         return NULL;
  379.         
  380.     PyDict_SetItem(callbackdict, key, py_handler);
  381.     
  382.     err = WEInstallObjectHandler(objectType, selector, handler, we);
  383.     if ( err ) return PyMac_Error(err);
  384.     Py_INCREF(Py_None);
  385.     return Py_None;
  386. """
  387.  
  388. stdhand = ManualGenerator("STDObjectHandlers", stdhandlers_body)
  389. inshand = ManualGenerator("WEInstallObjectHandler", inshandler_body)
  390.  
  391. # add the populated lists to the generator groups
  392. # (in a different wordl the scan program would generate this)
  393. for f in functions: module.add(f)
  394. module.add(stdhand)
  395. module.add(inshand)
  396. for f in methods: object.add(f)
  397. for f in methods2: object2.add(f)
  398.  
  399. # generate output (open the output file as late as possible)
  400. SetOutputFileName(OUTPUTFILE)
  401. module.generate()
  402.  
  403.